package com.fjsh.queues;

import com.fjsh.consts.ExchangeConst;
import com.fjsh.consts.QueuesConst;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

@Configuration
public class FanoutQueue {
    //region 扇形模式队列，一对多,只被消费一次
    /**
     * 创建队列
     * 此处使用第一个正常队列来示例完整队列过程
     * 参数name:队列的名称,不能为空；设置为“”以使代理生成该名称。
     * 参数durable：true表示为持久队列，该队列将在服务器重新启动后继续存在
     * 参数exclusive：如果声明独占队列，则为true,该队列将仅由声明者的连接使用
     * 参数autoDelete：如果服务器不再使用队列时应将其删除，则自动删除为true 参数arguments:用于声明队列的参数
     */
    @Bean
    public Queue testFanoutQueue() {
        /*
         * 1.new Queue(name); return new Queue("test_fanout_queue");
         */

        /*
         * 2.new Queue(name,durable);
         */
        return new Queue(QueuesConst.TEST_FANOUT_QUEUES, true, false, false);

        /*
         * 3.new Queue(name,durable,exclusive,autoDelete); return new
         * Queue("test_fanout_queue", true, false, false);
         */

        /*
         * 4.new Queue(name,durable,exclusive,autoDelete,arguments); return new
         * Queue("test_fanout_queue", true, true, true, null);
         */
    }

    /**
     * 创建交换机
     * 扇形交换器,它会把发送到该交换器的消息路由到所有与该交换器绑定的队列中，如果使用扇形交换器，则不会匹配路由Key
     * 解释：一个交换机可以绑定N个队列，此模式会将写入的队列发送到一个交换机，由此交换机发送到N个队列中，那么监听该队列的消费者都能收到对应的消息
     */
    @Bean
    @Primary
    public Exchange testFanoutExchange() {
        return new FanoutExchange(ExchangeConst.TEST_FANOUT_EXCHANGE);
    }

    /**
     * 绑定队列到交换机 Fanout模式不需要RoutingKey
     */
    @Bean
    public Binding testFanoutBinding() {
        return BindingBuilder.bind(testFanoutQueue()).to(testFanoutExchange()).with("").noargs();
    }
    //endregion
}
